// 模块化 
// 编程中的模块化 ： 遵守固定的规则，将一个大文件拆分成多个独立并互相依赖的多个小模块 。优点：复用性、可维护性、按需加载
// 模块化规范：①使用什么样的语法来引用模块 ②在模块中使用什么样的格式向外暴露成员
/**
 * node.js中根据模块来源不同，将模块分为了三大类
 * 内置模块 ： 比如fs,http,path
 * 自定义模块: 用户创建的每一个.js文件
 * 第三方模块：由第三方开发出来的模块，使用前需要先下载
 */
/**
 * 加载模块
 * require() 使用该方法加载用户自定义的模块时可以省略文件后缀名.js
 * 使用该方法加载其他模块时，会执行被加载模块中的代码
 * 
 * 
 * node.js中的模块作用域
 * 什么是模块作用域：和函数作用域类似 在自定义模块中定义的变量、方法等成员，只能在当前模块内被访问，这种模块级别的访问限制，叫做模块作用域
 * 
 * 
 *向外共享模块作用域中的成员
  module对象
  在每个.js自定义模块中都有一个module对象，它里面存储了和当前模块有关的信息
  {
    id: '.',
    path: 'D:\\Desktop\\nodeProjects\\模块化',
    exports: {},
    filename: 'D:\\Desktop\\nodeProjects\\模块化\\模块化.js',
    loaded: false,
    children: [],
    paths: [
      'D:\\Desktop\\nodeProjects\\模块化\\node_modules',
      'D:\\Desktop\\nodeProjects\\node_modules',
      'D:\\Desktop\\node_modules',
      'D:\\node_modules'
    ]
  }

  module.exports对象
  在自定义模块中，可以使用module.exports对象，将模块内的成员共享出去，供外界使用。外界使用require()方法导入自定义模块时，
  得到的就是module.exports所指向的对象
  在默认情况下 mmodule.exports = {} 为一个空对象

  共享成员时的注意点
  使用require()方法导入模块时，导入的结果，永远以module.exports指向的对象为准
  
  module.exports === exports
  时刻谨记：require()模块时，得到的永远是module.exports指向的对象


  node.js遵循commonjs模块化规范，commonjs规定了模块的特性和各模块之间如何相互依赖
  commonjs规定：
  每个模块内部，module变量代表当前模块
  module变量是一个对象，他的exports属性（即module.exports）是对外的接口
  加载某个模块，其实是加载该模块的module.exports属性，require()方法用于加载模块
 */

 console.log(module)